package websockets;

import java.io.IOException;
import java.io.StringWriter;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonWriter;
import javax.websocket.server.ServerEndpoint;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
/**
 * Esta clase controla cuantos jugadores y sincroniza la entrada en el juego
 * 
 * @author Pableras
 *
 */
@ServerEndpoint("/SalaEsperaWebSocket")
public class SalaEsperaWebSocket {
	static Set<Session> ColeccionUsuariosEsperando = Collections
			.synchronizedSet(new HashSet<Session>());
	/**
	 * Esta funcion recopila las sesiones de los usuario que se conectan.
	 * @param userSession
	 */
	@OnOpen
	public void handleOpen(Session userSession) {
		ColeccionUsuariosEsperando.add(userSession);
	}
	/**
	 * Esta funcion toma como nombre de usuario el primer dato que le venga y ordena comenzar
	 * el juego si es el segundo 
	 * @param message Es el mensaje enviado desde 
	 * @param userSession Contiene los datos de la sesion
	 * @throws IOException
	 */
	@OnMessage
	public void handleMessage(String message, Session userSession)
			throws IOException {

		if (!message.equals("comenzar")) {
			String nombreJugador = (String) userSession.getUserProperties()
					.get("nombreJugador");
			// Si el el jugador ya tiene nombre no se hace nada
			if (nombreJugador == null) {
				userSession.getUserProperties().put("nombreJugador", message);
				Iterator<Session> iterator = ColeccionUsuariosEsperando
						.iterator();
				while (iterator.hasNext()) {
					iterator.next().getBasicRemote().sendText(message);
				}
			}
		}else{
			Iterator<Session> iterator = ColeccionUsuariosEsperando
					.iterator();
			while (iterator.hasNext()) {
				iterator.next().getBasicRemote().sendText("comenzar");
			}
		}

	}
	/**
	 * Elimina los datos de sesion de la conexion y evita que se quede almacenado en cache
	 * @param userSession
	 */
	@OnClose
	public void handleClose(Session userSession) {
		ColeccionUsuariosEsperando.remove(userSession);
	}

}
